package com.terry.test3;

import java.util.Scanner;

/**
 * 题目描述
 * 中秋节，公司分月饼，m个员工，买了n个月饼，m<=n，每个员工至少分1个月饼，但可以分多个，单人份到最多月饼的个数为Max1，单人分到第二多月饼的个数是Max2，Max1-Max2<=3,。同理，单人分到第n-1多月饼的个数是Max(n-1)，单人分到第n多月饼的个数是Max(n)，Max(n-1)-Max(n)<=3。请问有多少种分月饼的方法？
 *
 * 输入描述：
 *
 * 第一行输入m n，表示m个员工，n个月饼，m<=n
 * 1
 * 输出描述：
 *
 * 输出有多少种月饼分法
 * 1
 * 解题思路：
 *   把n个月饼当做一个线段，划分m次。
 *
 * 假设，开始划分一次，划分了a个月饼，则此时m=m-1，n=n-a；
 * 再次划分时，划分了b个月饼，则此时m=m-1，n=n-b；
 * …
 * 最后第n次划分时，划分c个月饼，m=m-1=0，n=n-c=0；
 *
 * 这道题百思不得其解，最终通过学习思考，认定这是一道递归问题，最终通过研究借鉴逻辑，得出如下Java代码。
 *
 * 思路总结如下：
 * 1. m个人有n个月饼，先将m个人每个人分一个，剩余总月饼数为n-m=p；
 * 2. 假设第一个人最少分k个，第二个人范围就是[k, k+3]，Max(n-1)-Max(n)<=3。
 * 3. 当m为3个人时情况如下：
 * 4. 我们假设第一个人总是分到最少的，第二个人分到第二少的，依次类推；
 * 第一个人最少分0个（n-m后的p，就是给每位各分了一个后剩余的月饼数），剩下两个人有n-3（p）个月饼可分，此时，如果第二个人分k个，第三个人就是n-3-k（p-k）个，满足k<=p-k <= k+3(第三个人比第二个人的只多0-3个)；
 * 5. 依次循环类推，如果第一个人分1个，剩下两个人分n-3-1个，循环逻辑一致；
 * 6.同理，如果是四个人时，分为第一个人和后三个人，后三个人又分为第一个人和后两个人，第一个人总是分最少的，第二个比他多0-3个，依次类推，我们发现这是一个递归调用过程。代码需要有一个递归函数distribute，给他下一个数量，并让他完成递归判断。当然对于两个人的情况，我们单独判断即可。
 * ————————————————
 * 版权声明：本文为CSDN博主「国林哥」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
 * 原文链接：https://blog.csdn.net/weixin_42886699/article/details/121324989
 *
 * @author 小八
 * @date 2023年02月11日14:09
 */
public class Title23 {

    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        while(input.hasNextInt()) {
            //员工数
            int m = input.nextInt();
            //月饼数
            int n = input.nextInt();
            int nm = n - m;
            if (m > n) {
                System.out.println(0);
                return;
            }
            if(m==n || m==1){
                System.out.println(1);
                return;
            }
            int count  = 0;
            for(int i=0;i<nm;i++){
                count += mooncake(m-1,nm-i,i);
            }
            System.out.println(count);
        }
    }

    public static int mooncake(int m,int n,int pren){
//        if(m <= 0){
//            return 0;
//        }
//        if(n <= 0){
//            return 0;
//        }
        //当只剩一个人的时候
        if(m == 1){
            if(n>=pren && n<= pren+3){
                return 1;
            }
            return 0;
        }
        int count = 0;
        for(int i=pren;i<=pren+3;i++){
            count += mooncake(m-1,n-i,i);
        }
        return count ;
    }

}
